import java.util.*;
public class Main {
    /*用一个下标从 0 开始的二维整数数组 rectangles 来表示 n 个矩形，
    其中 rectangles[i] = [widthi, heighti] 表示第 i 个矩形的宽度和高度。
    如果两个矩形 i 和 j（i < j）的宽高比相同，则认为这两个矩形 可互换 。
    更规范的说法是，两个矩形满足 widthi/heighti == widthj/heightj（使用实数除法而非整数除法），
    则认为这两个矩形 可互换 。
    计算并返回 rectangles 中有多少对 可互换 矩形。*/
    public static long check(int[][] rectangles) {
        int n=rectangles.length;
        long count=0;
        Map<String,Long>arr=new HashMap<>();
        for(int i=0;i<n;i++){
           int high=rectangles[i][0];
           int low=rectangles[i][1];
           int gcd=gcd(high,low);//计算最大公约数
            String a=(high/gcd)+"/"+(low/gcd);//通过比较约分后的最简比例得出更准确的结果减小误差
            arr.put(a,arr.getOrDefault(a,0L)+1);
        }
        for(long d:arr.values()){
            if(d>=2){
                count+=d*(d-1)/2;
            }
        }
        return count;
    }
    private static int gcd(int a,int b){
        return b==0?a:gcd(b,a%b);
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[][] rectangles=new int[n][2];
        for(int i=0;i<n;i++){
            for(int j=0;j<2;j++){
                rectangles[i][j]=sc.nextInt();
            }
        }
        long count=check(rectangles);
        System.out.println(count);
    }
}